﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//构造函数:近似于初始函数
class Date
{
public:
	// 1.无参构造函数
	Date()// 函数名与类名相同。2. ⽆返回值。 (返回值啥都不需要给，也不需要写void，不要纠结，C++规定如此)
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}

	// 2.带参构造函数
	/*Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}*/

	// 3.全缺省构造函数
	/*Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;//以上三个构造函数不能同时存在,因为返回时存在歧义
	}*/

	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1;// 调⽤默认构造函数
	d1.Print();

	/*Date d2(2024, 7, 10);// 调⽤带参的构造函数编译会报错.
	d2.Print();*/

	/*Date d3(2024);
	d3.Print();*/

	//Date func();//error.如果通过⽆参构造函数创建对象时，对象后⾯不⽤跟括号
	//func.Print();

	return 0;
}

//举例子说明
typedef int STDataType;
class Stack
{
public:
	Stack(int n = 4)//构造函数
	{
		_a = (STDataType*)malloc(sizeof(STDataType) * n);
		if (nullptr == _a)
		{
			perror("malloc申请空间失败");
			return;
		}
		_capacity = n;
		_top = 0;
	}
	~Stack()//析构函数:释放空间
			{
				free(_a);
				_a = nullptr;
				_top = _capacity = 0;
			}
private:
	STDataType* _a;
	size_t _capacity;
	size_t _top;
};
// 两个Stack实现队列
class MyQueue
{
public:
	// 编译器默认生成MyQueue的构造函数调用了Stack的构造，完成了两个成员的初始化
	// 编译器默认生成MyQueue的析构函数调用了Stack的析构，释放的Stack内部的资源
	// 显示写析构，也会自动调用Stack的析构
	~MyQueue()
	{
		cout << "~MyQueue()" << endl;
	}
private:
	Stack pushst;
	Stack popst;
	//int size;
};
int main()
{
	MyQueue mq;
	Stack st1;
	Stack st2;//后定义的先析构

	return 0;
}


//赋值运算符重载
class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void Print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
	}

	bool operator==(Date d2)//至少有一个形参
	{
		return _year == d2._year
			&& _month == d2._month
			&& _day == d2._day;
	}

private:
	int _year;
	int _month;
	int _day;
};

//bool operator==(Date d1, Date d2)
//{
//	return d1._year == d2._year
//		&& d1._month == d2._month
//		&& d1._day == d2._day;
//}

int main()
{
	Date x1(2024, 7, 10);
	Date x2(2024, 7, 11);

	//operator==(x1, x2);//两个形参
	//x1 == x2;

	x1.operator==(x2);//operator==(Date d2)相对应
	x1 == x2;

	return 0;
}